package 哈希

import "sort"

/*
https://leetcode.cn/problems/group-anagrams/?envType=study-plan-v2&envId=top-100-liked

49. 字母异位词分组
给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

给你一个字符串数组, 请你将字母异位词组合在一起. 可以按任意顺序返回结果列表.
字母异位词 是

示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [
["bat"],   //由bat这3个字符组成的
["nat","tan"],  //由nat这三个字符组成的
["ate","eat","tea"]]  //由ate这3个字符组成的

示例 2:
输入: strs = [""]
输出: [[""]]

示例 3:
输入: strs = ["a"]
输出: [["a"]]
*/
func groupAnagrams(strs []string) [][]string {
	mp := map[string][]string{} //声明map   string作为key, []string作为value

	for _, curStr := range strs { //遍历字符串数组
		strArr := []byte(curStr)                                                 //当前字符串转为byte数组
		sort.Slice(strArr, func(i, j int) bool { return strArr[i] < strArr[j] }) //升序排序当前byte数组
		sortedStr := string(strArr)                                              //排序后的s, 转为sortStr
		mp[sortedStr] = append(mp[sortedStr], curStr)                            //将当前字符串, 存入排序好的sortStr对应的数组
	}

	ans := make([][]string, 0, len(mp)) //创建结果数组
	for _, v := range mp {              //将所有map的key-value对应的数组, 加入结果数组
		ans = append(ans, v)
	}
	return ans
}
